package org.TCC_NOVO.client.visual;

import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.gwtext.client.core.EventObject;
import com.gwtext.client.core.Function;
import com.gwtext.client.data.FieldDef;
import com.gwtext.client.data.IntegerFieldDef;
import com.gwtext.client.data.Record;
import com.gwtext.client.data.RecordDef;
import com.gwtext.client.data.Store;
import com.gwtext.client.data.StringFieldDef;
import com.gwtext.client.widgets.Button;
import com.gwtext.client.widgets.MessageBox;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.Tool;
import com.gwtext.client.widgets.Toolbar;
import com.gwtext.client.widgets.ToolbarButton;
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
import com.gwtext.client.widgets.grid.ColumnConfig;
import com.gwtext.client.widgets.grid.ColumnModel;
import com.gwtext.client.widgets.grid.GridPanel;
import com.gwtext.client.widgets.grid.event.GridCellListenerAdapter;
import java.util.ArrayList;
import org.TCC_NOVO.client.GWTServiceAsync;
import org.TCC_NOVO.client.modelo.OcorrenciaUnidade;
import org.TCC_NOVO.client.modelo.Unidade;

public class GerarSCORMPanel extends Panel{
    private final GWTServiceAsync controller;
    GerarSCORMPanel self;
    int IDF_Usuario = 0;

    //Master
    Store storeMaster;
    GridPanel gridMaster;
    RecordDef recordDefMaster;

    //Detail
    Store storeDetalhe;
    GridPanel gridDetalhe;
    RecordDef recordDefDetalhe;

    Toolbar toolbar;
    WaitingBar wainting;

    ArrayList<Unidade> ArrayUnidade = new ArrayList();
    ArrayList<OcorrenciaUnidade> ArrayOcorUnidade = new ArrayList();

    public GerarSCORMPanel(GWTServiceAsync controller, int idf_Usua) {
        this.controller = controller;
        this.IDF_Usuario = idf_Usua;
        this.self = this;
        this.init();
    }

    private void init(){
        this.setBorder(true);
        this.setPaddings(2);

        recordDefMaster = new RecordDef(new FieldDef[]{
            new IntegerFieldDef("ID"),
            new IntegerFieldDef("IDF_Projeto"),
            new StringFieldDef("nomeProjeto"),
            new StringFieldDef("nomeUnidade"),
            new StringFieldDef("status"),
            new StringFieldDef("descricaoUnidade"),
            new StringFieldDef("duracao"),
            new StringFieldDef("arquivo"),
            new StringFieldDef("arquivo_raiz"),
        });

        storeMaster = new Store(recordDefMaster);
        gridMaster = new GridPanel();
        gridMaster.setStore(storeMaster);

        ColumnConfig[] columns = new ColumnConfig[]{
            new ColumnConfig("Nome Projeto", "nomeProjeto", 190, true),
            new ColumnConfig("Nome Unidade", "nomeUnidade", 270, true),
            new ColumnConfig("Status", "status", 130, true),
            new ColumnConfig("Descrição", "descricaoUnidade", 190, true),
            new ColumnConfig("Duração", "duracao", 120, true),
        };

        ColumnModel columnModel = new ColumnModel(columns);
        gridMaster.setColumnModel(columnModel);
        gridMaster.setFrame(true);
        gridMaster.setStripeRows(true);
        gridMaster.setSize(1020, 280);
        gridMaster.setTitle("Unidades");
        gridMaster.addTool(new Tool(Tool.REFRESH, new Function() {
            @Override
            public void execute() {
                gridMaster.getEl().mask("Carregando", "x-mask-loading");
                CarregarGrid();
                CarrgarGridDetalhe();
                Timer timer = new Timer() {
                    @Override
                    public void run() {
                        gridMaster.getEl().unmask();
                    }
                };
                timer.schedule(1000);
            }
        }, "Atualizar"));

        gridMaster.addGridCellListener(new GridCellListenerAdapter(){
            @Override
            public void onCellClick(GridPanel grid, int rowIndex, int colIndex, EventObject e){
                storeDetalhe.filter("IDF_Unidade", grid.getSelectionModel().getSelected().getAsString("ID"));
            }
        });

        //Detalhes
        recordDefDetalhe = new RecordDef(new FieldDef[]{
            new IntegerFieldDef("ID"),
            new IntegerFieldDef("IDF_Unidade"),
            new StringFieldDef("data"),
            new StringFieldDef("usuario"),
            new StringFieldDef("descricao"),
            new StringFieldDef("observacao"),
        });

        storeDetalhe = new Store(recordDefDetalhe);
        gridDetalhe = new GridPanel();
        gridDetalhe.setStore(storeDetalhe);

        ColumnConfig[] columnsDetalhe = new ColumnConfig[]{
            new ColumnConfig("Data Ocorrência", "data", 120, true),
            new ColumnConfig("Usuário", "usuario", 130, true),
            new ColumnConfig("Descrição", "descricao", 250, true),
            new ColumnConfig("Observação", "observacao", 340, true),
        };

        ColumnModel columnModelDetalhe = new ColumnModel(columnsDetalhe);
        gridDetalhe.setColumnModel(columnModelDetalhe);
        gridDetalhe.setFrame(true);
        gridDetalhe.setTitle("Ocorrências Unidade");
        gridDetalhe.setStripeRows(true);
        gridDetalhe.setSize(1020, 300);
        gridDetalhe.setAutoScroll(true);

        toolbar = getToolbar();
        toolbar.setSize(gridMaster.getWidth(), 30);
        this.add(toolbar);
        this.add(gridMaster);
        this.add(gridDetalhe);

        CarregarGrid();
        CarrgarGridDetalhe();
    }

    public void CarregarGrid(){
        storeMaster.removeAll();
        String sSQL = "select A.ID, A.Nome, A.Descricao, A.IDF_Projeto, "+
                       "A.Status, A.Duracao, B.Nome NomeProj, A.Nome_Arquivo, A.Arquivo_Raiz "+
                       "from Unidade A "+
                       "inner join Projeto B on B.ID = A.IDF_Projeto "+
                       "where A.Status = 'Concluída' ";
        controller.RetornarDadosUnidade(sSQL, new CallBackRetUnidade());
    }

    private class CallBackRetUnidade implements AsyncCallback<ArrayList<Unidade>> {
        @Override
	public void onFailure(Throwable e) {
		MessageBox.alert("Erro ao carregar dados... ", e.getMessage());
	}
        @Override
	public void onSuccess(ArrayList<Unidade> result) {
                CarregarDados(result);
        }
    }

    private void CarregarDados(ArrayList<Unidade> result){
        ArrayUnidade = result;
        for (int i = 0; i < result.size(); ++i) {
            addRecord(result.get(i));
        }
    }

    public void addRecord(Unidade Unid){
        Object[] rowData = new Object[]{
          Unid.getId(),
          Unid.getIdf_projeto(),
          Unid.getNmProjeto(),
          Unid.getNome(),
          Unid.getStatus(),
          Unid.getDescricao(),
          Unid.getDuracao(),
          Unid.getArquivo(),
          Unid.getArquivoRaiz(),
        };
        Record record = recordDefMaster.createRecord(rowData[0].toString(), rowData);
        storeMaster.add(record);
    }

    private class CallBackRetOcoUnidade implements AsyncCallback<ArrayList<OcorrenciaUnidade>> {
        @Override
	public void onFailure(Throwable e) {
		MessageBox.alert("Erro ao carregar dados... ", e.getMessage());
	}
        @Override
	public void onSuccess(ArrayList<OcorrenciaUnidade> result) {
                CarregarDadosDetalhe(result);
                storeDetalhe.filter("IDF_Unidade", "VAZIO");
        }
    }

    private void CarregarDadosDetalhe(ArrayList<OcorrenciaUnidade> result){
        ArrayOcorUnidade = result;
        for (int i = 0; i < result.size(); ++i) {
            addRecordDetalhe(result.get(i));
        }
    }

    public void addRecordDetalhe(OcorrenciaUnidade OcoUnidade){
        Object[] rowData = new Object[]{
          OcoUnidade.getID(),
          OcoUnidade.getIDF_Unidade(),
          OcoUnidade.getData(),
          OcoUnidade.getUsuario(),
          OcoUnidade.getDescricao(),
          OcoUnidade.getObservacao(),
        };
        Record record = recordDefDetalhe.createRecord(rowData[0].toString(), rowData);
        storeDetalhe.add(record);
    }

    public void CarrgarGridDetalhe(){
        storeDetalhe.removeAll();
        String sSQL = "select * from ocorrencia_Unidade A "+
                      "inner join Usuario B on B.ID = A.IDF_Usuario";
        controller.RetornarDadosOcoUnidade(sSQL, new CallBackRetOcoUnidade());
    }

     private class CallBackRetGerar implements AsyncCallback<Boolean> {

        @Override
        public void onFailure(Throwable caught) {
            //MessageBox.alert(caught.getMessage());
            wainting.hide();
            MessageBox.alert("Problemas na geração! Verifique.");
        }

        @Override
        public void onSuccess(Boolean result) {
            MessageBox.alert(result.toString());
            wainting.hide();
            MessageBox.alert("Arquivo gerado com sucesso!");
        }

     }

    public Toolbar getToolbar(){

        ToolbarButton btnGerar = new ToolbarButton();
        btnGerar.setText(" Gerar Arquivo SCORM");
        btnGerar.setIcon("Images/SCORM.png");
        btnGerar.setTooltip("Permite Gerar o Arquivo no Formato SCORM da Unidade Selecionada");
        btnGerar.addListener(new ButtonListenerAdapter(){
            @Override
            public void onClick(Button button, EventObject e){
                if (gridMaster.getSelectionModel().getSelected() == null){
                    MessageBox.alert("Necessário Selecionar Algum Registro! ");
                }else{
                    //wainting bar para fazer o progresso...
                    wainting = new WaitingBar("SCORM");
                    wainting.show();
                    wainting.Executar();
                    controller.GerarUnidadeSCORM(
                            gridMaster.getSelectionModel().getSelected().getAsString("arquivo").trim(),
                            gridMaster.getSelectionModel().getSelected().getAsString("nomeProjeto").trim(),
                            gridMaster.getSelectionModel().getSelected().getAsString("nomeUnidade").trim(),
                            gridMaster.getSelectionModel().getSelected().getAsString("arquivo_raiz").trim(),
                            new CallBackRetGerar());
                }
            }
        });
        
        Toolbar toobar = new Toolbar();
        toobar.addButton(btnGerar);
        
        return toobar;
    }

}
